import { mapEquals } from '../../helper/index'
/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
export var checkInclusion = function (s1, s2) {
  const len1 = s1.length
  const len2 = s2.length
  if (len1 > len2) {
    return false
  }
  // 设置map，记录s1中每个字符出现的次数
  const map = new Map()
  for (let i = 0; i < len1; i++) {
    map.set(s1[i], map.get(s1[i]) + 1 || 1)
  }
  // 初始化当滑动窗口的map
  const map2 = new Map()
  for (let i = 0; i < len1; i++) {
    map2.set(s2[i], map2.get(s2[i]) + 1 || 1)
  }
  // 滑动窗口的左右指针
  let left = 0
  let right = left + len1 - 1
  while (right < len2) {
    if (mapEquals(map, map2)) {
      return true
    }
    // 滑动窗口的大小是固定的，左右指针同时向右移动1位
    left++
    right++
    // 移动后，左边的字符出现次数减1，如果为0，则删除。
    if (map2.get(s2[left - 1]) - 1) {
      map2.set(s2[left - 1], map2.get(s2[left - 1]) - 1)
    } else {
      map2.delete(s2[left - 1])
    }
    // 右边的字符出现次数加1
    map2.set(s2[right], map2.get(s2[right]) + 1 || 1)
  }
  return false
}
